package com.bruce.common.utils;

import android.os.Environment;
import android.os.StatFs;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 为程序操作文件提供公共方法类
 *
 * @author LiXiaolong
 * @version 1.0
 * @since 2013-5-6 下午1:59:16
 */
public class FileUtil {
    /**
     * MD5 算法
     *
     * @param src 加密前的字符串
     * @return 加密后的字符串
     */
    public static String MD5(String src) {
        // compute md5
        MessageDigest m;
        try {
            m = MessageDigest.getInstance("MD5");
            m.update(src.getBytes(), 0, src.length());
            // get md5 bytes
            byte p_md5Data[] = m.digest();
            // create a hex string
            String md5 = "";
            for (byte aP_md5Data : p_md5Data) {
                int b = (0xFF & aP_md5Data);
                // if it is a single digit, make sure it have 0 in front (proper padding)
                if (b <= 0xF)
                    md5 += "0";
                // add number to string
                md5 += Integer.toHexString(b);
            } // hex string to uppercase
            return md5;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 在SD卡上创建目录
     *
     * @param dirPath 目录路径
     */
    public static void createDir(String dirPath) {
        if (!EmptyUtil.isEmpty(dirPath)) {
            File file = new File(dirPath);
            if (!file.exists()) {
                file.mkdirs();
            }
        }
    }

    /**
     * 递归删除文件或文件夹
     *
     * @param file 要删除的文件或文件夹
     */
    public static boolean delete(File file) {
        if (file.exists()) { // 判断文件是否存在
            if (file.isFile()) { // 判断是否是文件
                file.delete(); // delete()方法 你应该知道 是删除的意思;
            } else if (file.isDirectory()) { // 否则如果它是一个目录
                File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
                for (File f : files) { // 遍历目录下所有的文件
                    delete(f); // 把每个文件 用这个方法进行迭代
                }
            }
            file.delete();
        }
        return true;
    }

    public static void copy(String oldPath, String newPath) {
        File old = new File(oldPath);
        if (old.exists()) {
            try {
                File file = new File(newPath);
                if (!file.exists()) {
                    file.createNewFile();
                }
                FileInputStream fis = new FileInputStream(old);
                FileOutputStream fos = new FileOutputStream(file);
                // 下面这一段代码不是很理解，有待研究
                byte[] buffer = new byte[2048];
                int count;
                while ((count = fis.read(buffer)) != -1) {
                    fos.write(buffer, 0, count);
                }
                fos.close();
                fis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static boolean exists(String filePath) {
        File file = new File(filePath);
        return file.exists();
    }

    public static void writeText2File(String dirPath, String fileName, String text){
		FileUtil.createDir(dirPath);
		String path = dirPath + fileName;
		File file = new File(path);
		try {
			if (!file.exists()) {
				file.createNewFile();
			}
            FileWriter fw = new FileWriter(path, true);
            fw.write(text);
            fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

//    /**
//     * 将文本内容写入文件
//     *
//     * @param file 缓存文件
//     * @param str  要缓存的Json
//     * @throws Exception
//     */
//    public static void writeTextFile(File file, String str) throws Exception {
//        DataOutputStream out = null;
//        try {
//            out = new DataOutputStream(new FileOutputStream(file));
//            out.write(str.getBytes());
//        } finally {
//            if (out != null) {
//                out.close();
//            }
//        }
//    }

//    /**
//     * 读取文件
//     *
//     * @param file 缓存文件
//     * @return 缓存的Json
//     * @throws Exception
//     */
//    public static String readTextFile(File file) throws Exception {
//        String text = null;
//        InputStream is = null;
//        try {
//            is = new FileInputStream(file);
//            String str = readTextInputStream(is);
//        } finally {
//            if (is != null) {
//                is.close();
//            }
//        }
//        return text;
//    }

//    /**
//     * 从流中读取文件
//     *
//     * @param is 数据流
//     * @return 字符串
//     * @throws java.io.IOException
//     */
//    public static String readTextInputStream(InputStream is) throws IOException {
//        StringBuilder strbuffer = new StringBuilder();
//        String line;
//        BufferedReader reader = null;
//        try {
//            reader = new BufferedReader(new InputStreamReader(is));
//            while ((line = reader.readLine()) != null) {
//                strbuffer.append(line);
//            }
//        } finally {
//            if (reader != null) {
//                reader.close();
//            }
//        }
//        return strbuffer.toString();
//    }

    /**
     * sd卡挂载且可用
     *
     * @return SD卡是否可用（true：可用，false：不可用）
     */
    public static boolean isSdcardMounted() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }

    /**
     * sd卡可用空间
     *
     * @return sd卡可用空间
     */
    public static long getSdcardAvailaleSize() {
        File path = Environment.getExternalStorageDirectory(); // 取得sdcard文件路径
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();
        return availableBlocks * blockSize;
    }

//	/**
//	 * sd卡总空间
//	 *
//	 * @return sd卡总空间
//	 */
//	public static long getSdcardTotalSize() {
//		File path = Environment.getExternalStorageDirectory();
//		StatFs stat = new StatFs(path.getPath());
//		long blockSize = stat.getBlockSize();
//		long availableBlocks = stat.getBlockCount();
//		return availableBlocks * blockSize;
//	}
//
//	/**
//	 * 手机内存可用空间
//	 *
//	 * @return 手机内存可用空间
//	 */
//	public static long getMemoryAvailableSize() {
//		File path = Environment.getDataDirectory();
//		StatFs stat = new StatFs(path.getPath());
//		long blockSize = stat.getBlockSize();
//		long availableBlocks = stat.getAvailableBlocks();
//		return availableBlocks * blockSize;
//	}
//
//	/**
//	 * 手机内存总空间
//	 *
//	 * @return 手机内存总空间
//	 */
//	public static long getMemoryTotalSize() {
//		File path = Environment.getDataDirectory();
//		StatFs stat = new StatFs(path.getPath());
//		long blockSize = stat.getBlockSize();
//		long totalBlocks = stat.getBlockCount();
//		return totalBlocks * blockSize;
//	}


}
